#include "mygui.h"
#include "ui_mygui.h"
#include <QFileDialog>
#include <vector>
#include <map>
#include <fstream>
#include <iostream>
#include <sstream>
#include "funcao.h"
#include "media.h"
#include "postprocessor.h"
using namespace std;

#include "filesystem.h"
#include "visualizationoptions.h"


//-------------------------------------------------------------------------
MyGUI::MyGUI(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MyGUI),
m_pMesh(NULL)
{
  ui->setupUi(this);
}
//-------------------------------------------------------------------------


//-------------------------------------------------------------------------
MyGUI::~MyGUI()
{
  delete ui;
}
//-------------------------------------------------------------------------


//-------------------------------------------------------------------------
void MyGUI::on_actionOpen_triggered()
{
  // abre arquivo com o dado de malha (nos e elementos)
  QFileDialog::Options options;
  QString selectedFilter;
  QString qFileName = QFileDialog::getOpenFileName(this,
    ("Open MESH"),
    "/home",
    ("Mesh Files (*.nf *.ts)"),
    &selectedFilter,
    options);
  // converte dado do tipo QString para string
  std::string fileName =  qFileName.toLocal8Bit().constData();
  // identifica qual a extensao do arquivo para utilizar o leitor apropriado
  string fileExtensionNF(".nf");
  string fileExtensionTS(".ts");
  size_t foundNF = fileName.rfind(fileExtensionNF);
  size_t foundTS = fileName.rfind(fileExtensionTS);

  // cria um objeto para armazenar os dados da malha contidos no arquivo
  if( m_pMesh != NULL )
    delete m_pMesh;
  m_pMesh = new Mesh();
  std::map<int,Mesh> surfaces;


  // le o arquivo e guarda os dados no objeto Mesh
  if( (foundNF!=string::npos)&&(foundNF==fileName.length()-3) )
  {
    cout << ".encontrou ARQUIVO NF" << endl;
    // cria um objeto do tipo FileSystem para ler o arquivo
    FileSystem fs;
    fs.read_NF_File( fileName, m_pMesh );
  }
  else if( (foundTS!=string::npos)&&(foundTS==fileName.length()-3) )
  {
    cout << ".encontrou ARQUIVO TS" << endl;
    // cria um objeto do tipo FileSystem para ler o arquivo
    FileSystem fs;
    fs.read_TS_File( fileName, m_pMesh, surfaces );
  }
  else
  {
    cout << ".NAO encontrou ARQUIVO" << endl;
    return;
  }

  // Apos ler os dados da malha, visualiza os dados com openGL
  ui->widget_2->viewMesh( m_pMesh );

}
//-------------------------------------------------------------------------


//-------------------------------------------------------------------------
void MyGUI::on_actionOptions_triggered()
{
  VisualizationOptions vOptions;
  PostProcessor action;
  vOptions.exec();
  vOptions.setmodeposprocessing();
  int nCurves = vOptions.getNumberOfIsoLines();
  if(vOptions.getnode_value())
	  action.metodoNos(m_pMesh);
  else
  if(vOptions.getpoint_element())
	  action.metodoElemento(m_pMesh);
  else
  if(vOptions.getelement_edge())
     action.metodoAresta(m_pMesh);
  else
  if(vOptions.getvolume_contouring())
	  action.metodoVolume(m_pMesh);
}
//-------------------------------------------------------------------------

